МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
Звіт
до лабораторної роботи №11
на тему «ПОЛЯ БІТІВ У СТРУКТУРАХ.
ПРОГРАМНА РЕАЛІЗАЦІЯ ОБ’ЄДНАНЬ»
з курсу «Проблемно-орієнтовані мови програмування»
ЛЬВІВ 2011
Мета роботи
Навчитися використовувати поля бітів у структурах для роботи з бітовими константами, а також реалізовувати логічні структури на основі об’єднань.
Теоретичні відомості
Мови С/C++ допускають використання в структурах особливого типу полів - так званих полів бітів. Це група сусідніх (двійкових) розрядів (бітів), розташованих в області пам'яті змінної цілого типу. Використання даних полів уможливлює доступ до окремих бітів більших об'єктів, наприклад байтів або слів. Використання полів бітів доцільно в тому випадку, коли для зберігання інформації в структурі даних досить декількох бітів.
Загальний синтаксис опису бітового поля:
тип [ім'я]: ширина;
Розглянемо кожне поле опису.
Поле "тип"
В C++ для визначення вмісту бітового поля дозволено використовувати будь-який тип, який інтерпретується як цілий: char, short, іnt, long (з модифікаторами sіgned або unsіgned), перерахування. У полях типу sіgned крайній лівий біт є знаковим. Наприклад, при оголошенні поля типу sіgned шириною в один біт (наприклад, sіgned а: 1;) воно буде здатне зберігати тільки -1 або 0, так як будь-яка ненульова величина буде сприйматися як (-1).
Поле "ім'я"
Посилання на бітове поле виконуються по імені, зазначеному в полі "ім'я". Якщо ім'я в даному полі не зазначено, то запитана кількість біт буде відведена, але доступ до них буде неможливий.
Дозволяється опис поля бітів без імені і з шириною рівною 0 - у цьому випадку наступне поле буде починатися із границі цілого (див. далі).
Поле "ширина"
Кожному полю виділяється точно стільки бітів, скільки зазначено в полі "ширина". Даний вираз повинен мати невід’ємне ціле значення. Це значення не може перевищувати числа розрядів, необхідного для подання значення типу, зазначеного в поле "тип".
Отже, оголошення структури, що містить поля бітів має такий вигляд:
struct ім'я_ структури
{ тип [ ім'я1 ] : ширина;
тип [ ім'я2 ] : ширина;
тип [ім'яN ] : ширина;
};
Доступ до полів бітів здійснюється так само, як і до інших елементів структурної змінної, тобто за допомогою операції вибору елемента ".".
Наприклад:
struct EXAMPLE
{ іnt a:2;
unsіgned іnt b:3;
unsіgned іnt c: 6 ;
іnt d:l;
} exam;
Доступ до оголошених полів у даному прикладі відбувається наступним чином:
exam.a - доступ до поля "а";
exam.b - доступ до поля "b" і т.д.
Доступ до полів бітів може здійснюватися і через вказівник на структуру, у яку поля входять, використовуючи операцію доступу через вказівник "->". Наприклад, якщо для попереднього приклада записати:
struct EXAMPLE *examp; examp = &exam;
то доступ, наприклад, до поля "b" буде забезпечений так: examp->b.
Необхідно відзначити, що хоча доступ до даних полів і здійснимо через вказівник на структуру, що містить це поле, але застосовувати операцію визначення адреси "& " до конкретного поля не можна. У зв'язку із цим визначаються правила ініціалізації полів бітів:
- поле біт може бути проініціалізоване тільки безпосередньою операцією присвоювання у вигляді
ім'я_структурної_змінної . ім'я_поля_біт =< вираз > ;
або:
ім'я_вказівника_структури -> ім'я__поля_біт =< вираз > .
Причому права частина може являти собою навіть виклик функції, яка повертає деяке значення, треба тільки стежити за тим, щоб дане значення могло вміститися у відведену для поля кількість бітів.
- поле бітів не може бути ініціалізовано функціями вводу типу scanf().
При роботі з бітовими полями неприпустимі:
- масиви бітових полів;
- вказівники на бітові поля;
- функції, що повертают...